{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _california_housing_dataset:\n",
      "\n",
      "California Housing dataset\n",
      "--------------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      "    :Number of Instances: 20640\n",
      "\n",
      "    :Number of Attributes: 8 numeric, predictive attributes and the target\n",
      "\n",
      "    :Attribute Information:\n",
      "        - MedInc        median income in block\n",
      "        - HouseAge      median house age in block\n",
      "        - AveRooms      average number of rooms\n",
      "        - AveBedrms     average number of bedrooms\n",
      "        - Population    block population\n",
      "        - AveOccup      average house occupancy\n",
      "        - Latitude      house block latitude\n",
      "        - Longitude     house block longitude\n",
      "\n",
      "    :Missing Attribute Values: None\n",
      "\n",
      "This dataset was obtained from the StatLib repository.\n",
      "http://lib.stat.cmu.edu/datasets/\n",
      "\n",
      "The target variable is the median house value for California districts.\n",
      "\n",
      "This dataset was derived from the 1990 U.S. census, using one row per census\n",
      "block group. A block group is the smallest geographical unit for which the U.S.\n",
      "Census Bureau publishes sample data (a block group typically has a population\n",
      "of 600 to 3,000 people).\n",
      "\n",
      "It can be downloaded/loaded using the\n",
      ":func:`sklearn.datasets.fetch_california_housing` function.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
      "      Statistics and Probability Letters, 33 (1997) 291-297\n",
      "\n",
      "(20640, 8)\n",
      "(20640,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "print(housing.DESCR)\n",
    "print(housing.data.shape)\n",
    "print(housing.target.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(11610, 8) (11610,)\n",
      "(3870, 8) (3870,)\n",
      "(5160, 8) (5160,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
    "    housing.data, housing.target, random_state = 7)\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(\n",
    "    x_train_all, y_train_all, random_state = 11)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_test.shape, y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_valid_scaled = scaler.transform(x_valid)\n",
    "x_test_scaled = scaler.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "wide_deep_model_1 (WideDeepM multiple                  1239      \n",
      "=================================================================\n",
      "Total params: 1,239\n",
      "Trainable params: 1,239\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# 子类API\n",
    "class WideDeepModel(keras.models.Model):\n",
    "    def __init__(self):\n",
    "        super(WideDeepModel, self).__init__()\n",
    "        \"\"\"定义模型的层次\"\"\"\n",
    "        self.hidden1_layer = keras.layers.Dense(30, activation='relu')\n",
    "        self.hidden2_layer = keras.layers.Dense(30, activation='relu')\n",
    "        self.output_layer = keras.layers.Dense(1)\n",
    "    \n",
    "    def call(self, input):\n",
    "        \"\"\"完成模型的正向计算\"\"\"\n",
    "        hidden1 = self.hidden1_layer(input)\n",
    "        hidden2 = self.hidden2_layer(hidden1)\n",
    "        concat = keras.layers.concatenate([input, hidden2])\n",
    "        output = self.output_layer(concat)\n",
    "        return output\n",
    "# model = WideDeepModel()\n",
    "model = keras.models.Sequential([\n",
    "    WideDeepModel(),\n",
    "])\n",
    "\n",
    "model.build(input_shape=(None, 8))\n",
    "        \n",
    "model.summary()\n",
    "model.compile(loss=\"mean_squared_error\", optimizer=\"sgd\")\n",
    "callbacks = [keras.callbacks.EarlyStopping(\n",
    "    patience=5, min_delta=1e-2)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "11610/11610 [==============================] - 1s 113us/sample - loss: 1.6621 - val_loss: 0.9397\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train_scaled, y_train,\n",
    "                    validation_data = (x_valid_scaled, y_valid),\n",
    "                    epochs = 1,\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAEzCAYAAAALosttAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd4HNWh/vHv2aZVl6xi2ZaNC7aMG27YEC7YVNMNoQdCCyEkIbRcbvgluSQ3PSGVxLQ0SmjGIUCwg2l2bEIz7gVccZG7XNXL6vz+mJW0llXWtqQd7b6f55lndmbO7p7DJn51Zs6cMdZaRERExD08sa6AiIiIHErhLCIi4jIKZxEREZdROIuIiLiMwllERMRlFM4iIiIu0244G2P+YozZZYxZ0cpxY4x5yBizzhizzBgztuOrKSIikjii6Tk/AZzXxvHzgcHh5TbgkWOvloiISOJqN5yttfOAvW0UmQo8ZR0fAFnGmF4dVUEREZFE0xHXnPsAWyK2i8P7RERE5Cj4uvLLjDG34Zz6JhgMjuvXr1+b5estbC6tp0fQkBEwXVHFTlNfX4/Hk1jj7xKtzWpv/Eu0Nqu9HWvNmjUl1tq8aMp2RDhvBfpGbBeG9x3GWvs48DhAUVGRXb16dZsfXFFTx7AHZnP/+UO5fdKgDqhq7MydO5fJkyfHuhpdKtHarPbGv0Rrs9rbsYwxm6It2xF/IrwK3BAetX0ycMBau70DPpeA16leTV19R3yciIhIt9Buz9kY8xwwGcg1xhQD3wP8ANbaR4FZwAXAOqACuLnDKuf14PUYqutCHfWRIiIirtduOFtrr23nuAW+3mE1aibJ51HPWUREEkqXDgg7GgGfh2qFs4hIzNXW1lJcXExVVVWsq9IpMjMz+eSTT475c4LBIIWFhfj9/qP+DPeHs1c9ZxERNyguLiY9PZ3+/ftjTPe+g6YlpaWlpKenH9NnWGvZs2cPxcXFDBgw4Kg/x/Vj5JP8CmcRETeoqqoiJycnLoO5oxhjyMnJOeazC64P54BXp7VFRNxCwdy+jvhv5PpwTvJ5Fc4iIgJAWlparKvQJVwfzs6AMN1KJSIiiaNbhLOuOYuISCRrLffddx8jRoxg5MiRvPDCCwBs376d008/ndGjRzNixAjmz59PKBTipptuaiz7m9/8Jsa1b5/rR2sn+TyUVdfFuhoiIuIiL730EkuWLGHp0qWUlJRw0kkncfrpp/Pss88yZcoUvvOd7xAKhaioqGDJkiVs3bqVFStWALB///4Y17593SKc95Sp5ywi4ib/98+VrNp2sEM/c1jvDL538fCoyr777rtce+21eL1eevbsyaRJk1iwYAEnnXQSt9xyC7W1tVx66aWMHj2agQMHsmHDBr7xjW9w4YUXcu6553ZovTtDDE9r26hKJfm81IQUziIi0r7TTz+defPm0adPH2666SaeeuopsrOzWbp0KZMnT+bRRx/l1ltvjXU12xWznnNKxbaoymlAmIiI+0Tbw+0sp512Go899hg33ngje/fuZd68eTz44INs2rSJwsJCvvzlL1NdXc2iRYu44IILCAQCXH755RQVFXH99dfHtO7RiFk4e0OVsGc95LT9KEjNECYiIs1ddtllvP/++5x44okYY/jFL35BQUEBTz75JA8++CB+v5+0tDSeeuoptm7dys0330x9vZMlP/3pT2Nc+/bF8JqzgcV/g7O/12YpzRAmIiINysrKAGeijwcffJAHH3zwkOM33ngjN95442HvW7RoUZfUr6PE7JpznS8FljwLobZHYmuGMBERSTQxC+dafwaU7YB1b7ZZTj1nERFJNLHtOafmw6Kn2ywX8Hqpq7eE6qMb3S0iItLdxfBWKgMnXgNrXofSna2WSvI7VVTvWUREEkVsp+8cewPYECx9rtUiAa/CWUREEktswzl3MPQ7BRY/Dbbl09YBn1NF3essIiKJIvYPvhjzRdizDja/3+LhpMZwVs9ZREQSQ+zDefilEEhvdWBYQOEsIiJHqa3nP2/cuJERI0Z0YW2iF/twDqTCyMth1ctQdeCww0k+L6BrziIikjhiH84AY26A2gpY8ffDDjWc1tbDL0RE5P7772fatGmN29///vf50Y9+xFlnncXYsWMZOXIkr7zyyhF/blVVFV/96lcZOXIkY8aMYc6cOQCsXLmSCRMmMHr0aEaNGsXatWspLy/nwgsv5MQTT2TEiBGNz5LuSO54ZGSfsZA/zDm1Pf6WQw41ntau1YAwERHX+Nf9sGN5x35mwUg4/2dtFrn66qu5++67+frXvw7A9OnTmT17NnfeeScZGRmUlJRw8sknc8kll2CMifqrp02bhjGG5cuX8+mnn3LuueeyZs0aHn30Ue666y6uu+46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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 31us/sample - loss: 0.4107\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.41072340325791706"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
